Jackson ব্যবহার করে Serialization (Java Object থেকে JSON) এবং Deserialization (JSON থেকে Java Object) এর কার্যকারিতা উন্নত করার জন্য কিছু টিপস এবং কৌশল রয়েছে। এই টিপসগুলো মেমোরি ব্যবস্থাপনা, পারফরম্যান্স, এবং ডেটা প্রসেসিংকে আরও কার্যকর করে তোলে।
Serialization এবং Deserialization উন্নত করার টিপস
১. ObjectMapper পুনঃব্যবহার করুন
ObjectMapper একটি ভারী ক্লাস, এবং প্রতিবার নতুন ObjectMapper তৈরি করা পারফরম্যান্স কমিয়ে দেয়।
ভালো পদ্ধতি:
public class ObjectMapperProvider {
private static final ObjectMapper mapper = new ObjectMapper();
public static ObjectMapper getInstance() {
return mapper;
}
}
- পুনঃব্যবহারযোগ্য
ObjectMapperব্যবহার করে বারবার নতুন ইনস্ট্যান্স তৈরি এড়ানো যায়।
২. Streaming API ব্যবহার করুন
বড় JSON ডেটা প্রসেস করার সময় মেমোরি ব্যবস্থাপনার জন্য Streaming API ব্যবহার করুন। এটি পুরো JSON লোড না করে অংশে অংশে প্রসেস করতে পারে।
উদাহরণ: JsonParser (Reading JSON)
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
public class StreamingExample {
public static void main(String[] args) throws Exception {
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(new File("large_data.json"));
while (!parser.isClosed()) {
JsonToken token = parser.nextToken();
if (JsonToken.FIELD_NAME.equals(token) && "name".equals(parser.getCurrentName())) {
parser.nextToken();
System.out.println("Name: " + parser.getValueAsString());
}
}
}
}
৩. Avoid Writing Timestamps
Jackson ডিফল্টভাবে তারিখ এবং সময়কে টাইমস্ট্যাম্প হিসেবে সিরিয়ালাইজ করে। এটি পড়তে বা ডিবাগ করতে কঠিন।
সমাধান:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
উদাহরণ: LocalDateTime এর জন্য JavaTimeModule:
mapper.registerModule(new JavaTimeModule());
৪. Avoid Unknown Properties
JSON ডেটায় অজানা প্রোপার্টি থাকলে Jackson DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES এর কারণে ব্যর্থ হতে পারে।
সমাধান:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
৫. Custom Serializer এবং Deserializer ব্যবহার করুন
কমপ্লেক্স অবজেক্ট বা কাস্টম ডেটা ফরম্যাটের ক্ষেত্রে কাস্টম Serializer এবং Deserializer ব্যবহার করুন।
Custom Serializer উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class CustomUserSerializer extends StdSerializer<User> {
public CustomUserSerializer() {
super(User.class);
}
@Override
public void serialize(User user, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("user_name", user.getName());
gen.writeNumberField("user_age", user.getAge());
gen.writeEndObject();
}
}
৬. Disable Default Typing
enableDefaultTyping ব্যবহার করলে Jackson টাইপ ইনফরমেশন JSON-এ সংযুক্ত করে, যা নিরাপত্তা এবং পারফরম্যান্স সমস্যার কারণ হতে পারে।
সমাধান:
- ডিফল্ট টাইপিং এড়ানোর জন্য এটি নিষ্ক্রিয় রাখুন:
mapper.deactivateDefaultTyping();
৭. Use @JsonView for Partial Serialization
সব ফিল্ড JSON-এ অন্তর্ভুক্ত না করার জন্য @JsonView ব্যবহার করুন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonView;
class User {
@JsonView(Views.Public.class)
public String name;
@JsonView(Views.Internal.class)
public int age;
}
class Views {
public static class Public {}
public static class Internal extends Public {}
}
ব্যবহার:
String json = mapper.writerWithView(Views.Public.class).writeValueAsString(user);
৮. Avoid Excessive Annotations
Jackson-এ অতিরিক্ত @JsonIgnore, @JsonProperty ইত্যাদি ব্যবহার করলে কোড জটিল হয়ে যায়। প্রয়োজনীয় ক্ষেত্রেই এগুলো ব্যবহার করুন।
৯. Minimize Inclusion with JsonInclude
ডিফল্ট বা null ফিল্ডগুলো JSON থেকে বাদ দেওয়ার জন্য JsonInclude ব্যবহার করুন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
class User {
public String name;
public String email;
}
১০. Use Tree Model for Dynamic JSON
যদি JSON ফিল্ডগুলো ডাইনামিক হয় এবং আগে থেকে জানা না থাকে, JsonNode ব্যবহার করুন।
উদাহরণ:
JsonNode node = mapper.readTree(jsonString);
String name = node.get("name").asText();
int age = node.get("age").asInt();
Performance Optimization Summary
| টিপস | উদ্দেশ্য | সুবিধা |
|---|---|---|
ObjectMapper পুনঃব্যবহার | ObjectMapper বারবার তৈরি করা এড়ানো। | পারফরম্যান্স উন্নত এবং কম মেমোরি ব্যবহার। |
| Streaming API | বড় JSON ডেটা প্রসেস করা। | মেমোরি ব্যবস্থাপনা উন্নত। |
FAIL_ON_UNKNOWN_PROPERTIES বন্ধ রাখা | অজানা ফিল্ডের কারণে ব্যর্থতা এড়ানো। | JSON ডেটার গঠন পরিবর্তিত হলেও ডেসিরিয়ালাইজ সম্ভব। |
| Custom Serializer/Deserializer | জটিল ফিল্ড বা ডেটা ফরম্যাট হ্যান্ডল করা। | ফিল্ডগুলোর কাস্টম নিয়ম সংজ্ঞায়িত করা। |
@JsonView | আংশিক JSON সিরিয়ালাইজেশন। | শুধুমাত্র প্রয়োজনীয় ডেটা অন্তর্ভুক্ত। |
| Tree Model | ডাইনামিক JSON ডেটা প্রসেস। | অজানা বা পরিবর্তনশীল ফিল্ড সহজে হ্যান্ডল করা। |
Jackson ব্যবহার করে কার্যকর Serialization এবং Deserialization নিশ্চিত করার জন্য:
- ObjectMapper পুনঃব্যবহার করুন।
- বড় JSON এর ক্ষেত্রে Streaming API ব্যবহার করুন।
- নির্দিষ্ট ক্ষেত্রে Custom Serializer/Deserializer ব্যবহার করুন।
- Unnecessary Fields বাদ দেওয়ার জন্য
JsonIncludeএবং@JsonViewব্যবহার করুন। - ডাইনামিক বা বড় JSON প্রসেস করার জন্য Tree Model ব্যবহার করুন।
সঠিক কৌশলগুলো ব্যবহার করলে Jackson-এর মাধ্যমে JSON ডেটা প্রসেসিং দ্রুত, কার্যকর, এবং মেমোরি সাশ্রয়ী হবে।
Read more